﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpGenericTeach
{
    
    public class Course
    {
        public string CourseName { get; set; }

        public int Period { get; set; }
    }

    public class Teacher
    {
        public Teacher() { }

        public string Name { get; set; }

        public int CourseCount { get; set; }
    }

    /// <summary>
    /// 泛型约束
    /// </summary>
    public class MyGenericClass2<T1,T2,T3>
        where T1:struct //T1:表示值类型
        where T2:class  //T2:表示引用类型
        where T3:new()  //T3:表示这个类中，必须有一个无参数的构造方法，这个约束必须放到最后

        //其他的类型：基类类型、接口类型.....
    {
        public List<T2> CountList { get; set; }

        public T3 Publisher { get; set; }

        public MyGenericClass2()
        {
            this.CountList = new List<T2>();
            Publisher = new T3(); //如果没有这个泛型约束，是不能直接这样子使用的
        }

        public T2 BuyCourse(T1 index)
        {
            //return this.CountList[index]; //直接写是错误的
            dynamic _index = index;  //dynamic是在运行的时候解析对象的类型,在编译阶段不解析

            return this.CountList[_index];
        }

    }
}
